今天來介紹一個比較進階的語法,你可能前期用不到它,但當你越來越厲害之後你就會發現它。
今天會學到
泛型使你能夠編寫靈活的、可重用的函數和類型,這些函數和類型可以與任何類型一起使用。泛型是 Swift 最強大的特性之一,而且 Swift標準庫的大部分都是用泛型代碼構建的。用了他可以避免寫許多重複的程式碼。
我們先簡單看以下這個例子。
func swapTwoInts(_ a: inout Int, _ b: inout Int) {
let temporaryA = a
a = b
b = temporaryA
}
簡單來說這個函式在做的是把a跟b這兩個數字交換再輸出參數。
那我們再來看看下面這個例子
func swapTwoStrings(_ a: inout String, _ b: inout String) {
let temporaryA = a
a = b
b = temporaryA
}
是不是跟上面長得幾乎一樣,只是把Int型別換成了String型別。
泛型函數可以用於任何類型
func swapTwoValues<T>(_ a: inout T, _ b: inout T) {
let temporaryA = a
a = b
b = temporaryA
}
從上面的程式碼我們看到,剛剛的Int跟String變成了T
,那T是什麼呢?佔位符類型名稱
,而不是實際類型名稱(Int, Double, String等等)。佔位符類型名稱沒有說明T必須是什麼,但是a和b必須是相同的type T!!!
類型參數就是在函數後面用<>括起來的T,func swapTwoValues<T>
。一旦指定了類型參數,就可以使用它來定義函數參數的類型。在swapTwoValues(::)下面的例子中,第一次調用函數時被替換,T第二次調用時被替換。
func swapTwoValues<T>(_ a: inout T, _ b: inout T) {
let temporaryA = a
a = b
b = temporaryA
}
var someInt = 3
var anotherInt = 107
swapTwoValues(&someInt, &anotherInt) //someInt跟anotherInt交換數字
var someString = "hello"
var anotherString = "world"
swapTwoValues(&someString, &anotherString) //someString跟anotherString交換字串
p.s.大家習慣用T來表示佔位符
在很多情況下,我們的型別參數會取原本就有意義的名字,像是字典Dictionary<Key, Value>
、陣列Array[Element]
,來讓大家知道泛型類型跟函數之間的關係,但如果沒有的話我們通常會用T。
泛型還有許多進階用法,可以看看我老師的文章~